/**
 * 模板方法模式
 */
//  定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
// 通俗地说，模板方法模式就是一个关于继承的设计模式。

abstract class LeaveRequest {
    request() {
        console.log('本人');
        console.log(this.name());
        console.log('因');
        console.log(this.reason());
        console.log('需请假');
        console.log(this.duration());
        console.log('天，望批准');
    }

    abstract name(): string;

    abstract reason(): string;

    abstract duration(): string;
}

class MyLeaveRequest extends LeaveRequest {
    name() {
        return '阿笠';
    }

    reason() {
        return '参加力扣周赛';
    }

    duration() {
        return '0.5';
    }
}
new MyLeaveRequest().request();

// 在使用模板方法模式时，我们可以为不同的模板方法设置不同的控制权限：

// 如果不希望子类覆写模板中的某个方法，使用 final 修饰此方法；
// 如果要求子类必须覆写模板中的某个方法，使用 abstract 修饰此方法；
// 如果没有特殊要求，可使用 protected 或 public 修饰此方法，子类可根据实际情况考虑是否覆写。
